package com.lq.controller.user;

import com.lq.constant.Contant;
import com.lq.entity.User;
import com.lq.exception.UserIsExistException;
import com.lq.exception.UserRegisterException;
import com.lq.service.UserService;
import com.lq.util.DateUtil;
import com.lq.util.IOUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.*;
import java.util.UUID;

//这个编程式配置就相当于在web.xml中配置对应的servlet了，所以这里省去了在xml中的配置
@WebServlet("/user/register")
@MultipartConfig
public class RegisterServlet extends HttpServlet {

    UserService userService = new UserService();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException {
        //1.获取前端view层的数据  --->  controller层封装数据  --->  将数据传递给model层处理业务逻辑，处理好之后  --->  controller层拿出数据给view层的jsp作展示

        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //获取文件部分
        //声明变量，我们定义在外面，这样对变量进行处理异常的时候也不至于作用域只在try中
        Part profile = null;
        InputStream input = null;
        try {
            //需要使用注解@MultipartConfig才能使用下面方法，才能获取图片的输入流
            profile = req.getPart("profile");
            input = profile.getInputStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        //判断一下，如果上传一个空文件，我们又重定向到注册页面
        if(input == null) {
            try {
                resp.sendRedirect(req.getContextPath()+"/register.jsp");
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        //需要使用uuid处理文件名，保证命名唯一确定
        String fileName = UUID.randomUUID() + "_"+profile.getSubmittedFileName();

        //根据日期给文件夹创建目录
        //为了保存代码低耦合和简介，这里进行了工具类封装
        String format = DateUtil.getNowString();
        //这里我们遵循开发规范，不应该将用户图片放在项目中，所以我们另外设置了一个文件路径作为项目的外部资源
        String path = Contant.BASE_PATH + format + "/";

        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }

        //将页面上传的图片复制到指定路径下，
        IOUtil.copy(input, path + fileName);

        //对用户进行封装，并传递给Service层
        User user = new User(username, password, path + fileName);
        try{
            userService.register(user);
            //成功就重定向到成功页面
            req.getRequestDispatcher("/WEB-INF/pages/webpages/RegisterSuccess.jsp").forward(req, resp);
        }catch (UserIsExistException e){
            try {
                //失败就重定向到失败页面
                req.setAttribute("msg","用户已经存在！！！");
                req.getRequestDispatcher("/WEB-INF/pages/webpages/RegisterRrror.jsp").forward(req, resp);
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        }catch(UserRegisterException e){
            try {
                //失败就重定向到失败页面
                req.setAttribute("msg","你的用户名或者密码为空！！！");
                req.getRequestDispatcher("/WEB-INF/pages/webpages/RegisterRrror.jsp").forward(req, resp);
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
